#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MaxSize 10
#define ElemType int
typedef struct
{
    ElemType data[MaxSize];
    int top;
} SqStack;

void init(SqStack *);
bool is_empty(SqStack *);
bool is_full(SqStack *);
void push(SqStack *, ElemType);  // 压栈
void traverse(SqStack *);        // 遍历栈输出
bool pop(SqStack *, ElemType *); // 出栈
void clear(SqStack *);           // 清空栈

int main()
{
    SqStack S;
    ElemType val;
    init(&S);
    push(&S, 6);
    push(&S, 8);
    push(&S, 3);
    traverse(&S);
    if (pop(&S, &val))
        printf("出栈成功, 出栈元素为: %d\n", val);
    else
        printf("出栈失败!\n");
    traverse(&S);
    clear(&S);
    traverse(&S);
    return 0;
}

void init(SqStack *pS)
{
    pS->top = -1;
    return;
}
bool is_empty(SqStack *pS)
{
    if (pS->top == -1)
        return true;
    return false;
}
bool is_full(SqStack *pS)
{
    if (pS->top == MaxSize - 1)
        return true;
    return false;
}
void push(SqStack *pS, ElemType val) // 压栈
{
    if (is_full(pS))
    {
        printf("入栈失败, 栈已满!\n");
        return;
    }
    pS->data[++pS->top] = val;
    return;
}
void traverse(SqStack *pS) // 遍历栈输出
{
    if (is_empty(pS))
    {
        printf("遍历输出失败, 栈为空!\n");
        return;
    }
    int temp = pS->top;
    while (temp > -1)
    {
        printf("%d ", pS->data[temp--]);
    }
    printf("\n遍历完成\n");
    return;
}
bool pop(SqStack *pS, ElemType *pVal) // 出栈
{
    if (is_empty(pS))
    {
        printf("出栈失败, 栈为空!\n");
        return false;
    }
    *pVal = pS->data[pS->top--];
    return true;
}
void clear(SqStack *pS) // 清空栈
{
    pS->top = -1;
    printf("栈清空完成!\n");
    return;
}